From d836fa51346ddb6999f200c6d7cae73703de510a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Timm=20B=C3=A4der?= Date: Sat, 15 Jul 2017 20:43:52 +0200 Subject: [PATCH] treeviewcolumn: Remove input window --- gtk/gtktreeprivate.h | 7 +-- gtk/gtktreeview.c | 71 +++++++++----------------- gtk/gtktreeviewcolumn.c | 110 +++++++++++++--------------------------- 3 files changed, 64 insertions(+), 124 deletions(-) diff --git a/gtk/gtktreeprivate.h b/gtk/gtktreeprivate.h index 820187e6c4..bac7d80a39 100644 --- a/gtk/gtktreeprivate.h +++ b/gtk/gtktreeprivate.h @@ -93,8 +93,7 @@ gboolean _gtk_tree_selection_row_is_selectable (GtkTreeSelection *sele void _gtk_tree_view_column_realize_button (GtkTreeViewColumn *column); -void _gtk_tree_view_column_unrealize_button (GtkTreeViewColumn *column); - + void _gtk_tree_view_column_set_tree_view (GtkTreeViewColumn *column, GtkTreeView *tree_view); gint _gtk_tree_view_column_request_width (GtkTreeViewColumn *tree_column); @@ -133,13 +132,15 @@ void gtk_tree_view_column_cell_snapshot (GtkTreeViewColumn *tree_column, void _gtk_tree_view_column_cell_set_dirty (GtkTreeViewColumn *tree_column, gboolean install_handler); gboolean _gtk_tree_view_column_cell_get_dirty (GtkTreeViewColumn *tree_column); -GdkWindow *_gtk_tree_view_column_get_window (GtkTreeViewColumn *column); void _gtk_tree_view_column_push_padding (GtkTreeViewColumn *column, gint padding); gint _gtk_tree_view_column_get_requested_width (GtkTreeViewColumn *column); gint _gtk_tree_view_column_get_drag_x (GtkTreeViewColumn *column); GtkCellAreaContext *_gtk_tree_view_column_get_context (GtkTreeViewColumn *column); +gboolean _gtk_tree_view_column_coords_in_resize_rect (GtkTreeViewColumn *column, + double x, + double y); G_END_DECLS diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index 1c1ede9f4c..5ea16185cd 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -2165,7 +2165,6 @@ gtk_tree_view_map_buttons (GtkTreeView *tree_view) { GtkTreeViewColumn *column; GtkWidget *button; - GdkWindow *window; for (list = tree_view->priv->columns; list; list = list->next) { @@ -2179,21 +2178,6 @@ gtk_tree_view_map_buttons (GtkTreeView *tree_view) !gtk_widget_get_mapped (button)) gtk_widget_map (button); } - for (list = tree_view->priv->columns; list; list = list->next) - { - column = list->data; - if (gtk_tree_view_column_get_visible (column) == FALSE) - continue; - - window = _gtk_tree_view_column_get_window (column); - if (gtk_tree_view_column_get_resizable (column)) - { - gdk_window_raise (window); - gdk_window_show (window); - } - else - gdk_window_hide (window); - } } } @@ -2245,7 +2229,6 @@ gtk_tree_view_unrealize (GtkWidget *widget) { GtkTreeView *tree_view = GTK_TREE_VIEW (widget); GtkTreeViewPrivate *priv = tree_view->priv; - GList *list; if (priv->scroll_timeout != 0) { @@ -2288,9 +2271,6 @@ gtk_tree_view_unrealize (GtkWidget *widget) g_source_remove (priv->typeselect_flush_timeout); priv->typeselect_flush_timeout = 0; } - - for (list = priv->columns; list; list = list->next) - _gtk_tree_view_column_unrealize_button (GTK_TREE_VIEW_COLUMN (list->data)); if (priv->drag_window) { @@ -3126,24 +3106,18 @@ gtk_tree_view_column_multipress_gesture_pressed (GtkGestureMultiPress *gesture, gdouble y, GtkTreeView *tree_view) { - GdkEventSequence *sequence; GtkTreeViewColumn *column; - const GdkEvent *event; GList *list; - gint i; if (n_press != 2) return; - sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture)); - event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), sequence); - - for (i = 0, list = tree_view->priv->columns; list; list = list->next, i++) + for (list = tree_view->priv->columns; list; list = list->next) { column = list->data; - if (event->any.window != _gtk_tree_view_column_get_window (column) || - !gtk_tree_view_column_get_resizable (column)) + if (!_gtk_tree_view_column_coords_in_resize_rect (column, x, y) || + !gtk_tree_view_column_get_resizable (column)) continue; if (gtk_tree_view_column_get_sizing (column) != GTK_TREE_VIEW_COLUMN_AUTOSIZE) @@ -3164,18 +3138,12 @@ gtk_tree_view_column_drag_gesture_begin (GtkGestureDrag *gesture, gdouble start_y, GtkTreeView *tree_view) { - GdkEventSequence *sequence; GtkTreeViewColumn *column; - const GdkEvent *event; - GdkWindow *window; gboolean rtl; GList *list; gint i; rtl = (gtk_widget_get_direction (GTK_WIDGET (tree_view)) == GTK_TEXT_DIR_RTL); - sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture)); - event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), sequence); - window = event->any.window; for (i = 0, list = tree_view->priv->columns; list; list = list->next, i++) { @@ -3184,7 +3152,7 @@ gtk_tree_view_column_drag_gesture_begin (GtkGestureDrag *gesture, column = list->data; - if (window != _gtk_tree_view_column_get_window (column)) + if (!_gtk_tree_view_column_coords_in_resize_rect (column, start_x, start_y)) continue; if (!gtk_tree_view_column_get_resizable (column)) @@ -3254,13 +3222,6 @@ gtk_tree_view_button_release_drag_column (GtkTreeView *tree_view) gtk_widget_set_parent (button, GTK_WIDGET (tree_view)); g_object_unref (button); gtk_widget_queue_resize (widget); - if (gtk_tree_view_column_get_resizable (tree_view->priv->drag_column)) - { - gdk_window_raise (_gtk_tree_view_column_get_window (tree_view->priv->drag_column)); - gdk_window_show (_gtk_tree_view_column_get_window (tree_view->priv->drag_column)); - } - else - gdk_window_hide (_gtk_tree_view_column_get_window (tree_view->priv->drag_column)); gtk_widget_grab_focus (button); @@ -4505,6 +4466,8 @@ gtk_tree_view_motion (GtkWidget *widget, GtkRBTree *tree; GtkRBNode *node; gint new_y; + GList *list; + gboolean cursor_set = FALSE; tree_view = (GtkTreeView *) widget; @@ -4524,6 +4487,25 @@ gtk_tree_view_motion (GtkWidget *widget, prelight_or_select (tree_view, tree, node, event->x, event->y); } + for (list = tree_view->priv->columns; list; list = list->next) + { + GtkTreeViewColumn *column = list->data; + + if (_gtk_tree_view_column_coords_in_resize_rect (column, event->x, event->y)) + { + GdkDisplay *display = gtk_widget_get_display (widget); + GdkCursor *cursor = gdk_cursor_new_from_name (display, "col-resize"); + + gtk_widget_set_cursor (widget, cursor); + g_object_unref (cursor); + cursor_set = TRUE; + break; + } + } + + if (!cursor_set) + gtk_widget_set_cursor (widget, NULL); + return GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->motion_notify_event (widget, event); } @@ -11499,9 +11481,6 @@ gtk_tree_view_remove_column (GtkTreeView *tree_view, position = g_list_index (tree_view->priv->columns, column); - if (gtk_widget_get_realized (GTK_WIDGET (tree_view))) - _gtk_tree_view_column_unrealize_button (column); - _gtk_tree_view_column_unset_tree_view (column); tree_view->priv->columns = g_list_remove (tree_view->priv->columns, column); diff --git a/gtk/gtktreeviewcolumn.c b/gtk/gtktreeviewcolumn.c index d989e4dcc4..02d44363c3 100644 --- a/gtk/gtktreeviewcolumn.c +++ b/gtk/gtktreeviewcolumn.c @@ -35,6 +35,7 @@ #include "gtkintl.h" #include "gtktypebuiltins.h" #include "a11y/gtktreeviewaccessibleprivate.h" +#include "gtkwidgetprivate.h" /** @@ -130,7 +131,6 @@ struct _GtkTreeViewColumnPrivate GtkWidget *child; GtkWidget *arrow; GtkWidget *frame; - GdkWindow *window; gulong property_changed_signal; gfloat xalign; @@ -829,6 +829,7 @@ gtk_tree_view_column_create_button (GtkTreeViewColumn *tree_column) priv->frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (priv->frame), GTK_SHADOW_NONE); + gtk_widget_set_hexpand (priv->frame, TRUE); gtk_widget_set_halign (priv->frame, GTK_ALIGN_START); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2); @@ -976,25 +977,10 @@ gtk_tree_view_column_update_button (GtkTreeViewColumn *tree_column) gtk_tree_view_get_headers_visible (GTK_TREE_VIEW (priv->tree_view))) { gtk_widget_show (priv->button); - - if (priv->window) - { - if (priv->resizable) - { - gdk_window_show (priv->window); - gdk_window_raise (priv->window); - } - else - { - gdk_window_hide (priv->window); - } - } } else { gtk_widget_hide (priv->button); - if (priv->window) - gdk_window_hide (priv->window); } } @@ -1297,52 +1283,14 @@ void _gtk_tree_view_column_realize_button (GtkTreeViewColumn *column) { GtkTreeViewColumnPrivate *priv = column->priv; - GtkAllocation allocation; - GtkTreeView *tree_view; - gboolean rtl; - GdkDisplay *display; - GdkCursor *cursor; - tree_view = (GtkTreeView *)priv->tree_view; - rtl = (gtk_widget_get_direction (priv->tree_view) == GTK_TEXT_DIR_RTL); - - g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); + g_return_if_fail (GTK_IS_TREE_VIEW (priv->tree_view)); g_return_if_fail (gtk_widget_get_realized (priv->tree_view)); g_return_if_fail (priv->button != NULL); - gtk_widget_set_parent_window (priv->button, gtk_widget_get_window (priv->tree_view)); - - display = gtk_widget_get_display (priv->tree_view); - gtk_widget_get_allocation (priv->button, &allocation); - - priv->window = gdk_window_new_input (gtk_widget_get_window (priv->tree_view), - GDK_ALL_EVENTS_MASK, - &(GdkRectangle) {(allocation.x + (rtl ? 0 : allocation.width)) - TREE_VIEW_DRAG_WIDTH / 2, 0, - TREE_VIEW_DRAG_WIDTH, _gtk_tree_view_get_header_height (tree_view)}); - cursor = gdk_cursor_new_from_name (display, "col-resize"); - gdk_window_set_cursor (priv->window, cursor); - g_object_unref (cursor); - - gtk_widget_register_window (GTK_WIDGET (tree_view), priv->window); - gtk_tree_view_column_update_button (column); } -void -_gtk_tree_view_column_unrealize_button (GtkTreeViewColumn *column) -{ - GtkTreeViewColumnPrivate *priv; - - g_return_if_fail (column != NULL); - - priv = column->priv; - g_return_if_fail (priv->window != NULL); - - gtk_widget_unregister_window (GTK_WIDGET (priv->tree_view), priv->window); - gdk_window_destroy (priv->window); - priv->window = NULL; -} - void _gtk_tree_view_column_unset_model (GtkTreeViewColumn *column, GtkTreeModel *old_model) @@ -2069,9 +2017,7 @@ _gtk_tree_view_column_allocate (GtkTreeViewColumn *tree_column, int width) { GtkTreeViewColumnPrivate *priv; - gboolean rtl; GtkAllocation allocation = { 0, 0, 0, 0 }; - GtkAllocation widget_allocation; GtkAllocation clip; g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column)); @@ -2085,27 +2031,20 @@ _gtk_tree_view_column_allocate (GtkTreeViewColumn *tree_column, priv->width = width; gtk_cell_area_context_allocate (priv->cell_area_context, priv->width - priv->padding, -1); - gtk_widget_get_allocation (priv->tree_view, &widget_allocation); if (gtk_tree_view_get_headers_visible (GTK_TREE_VIEW (priv->tree_view))) { - allocation.x = widget_allocation.x + x_offset; - allocation.y = widget_allocation.y; + /* TODO: Underallocates the button horizontally, but + * https://bugzilla.gnome.org/show_bug.cgi?id=770388 + */ + allocation.x = x_offset; + allocation.y = 0; allocation.width = width; allocation.height = _gtk_tree_view_get_header_height (GTK_TREE_VIEW (priv->tree_view)); gtk_widget_size_allocate (priv->button, &allocation, -1, &clip); } - if (priv->window) - { - rtl = (gtk_widget_get_direction (priv->tree_view) == GTK_TEXT_DIR_RTL); - gdk_window_move_resize (priv->window, - allocation.x + (rtl ? 0 : allocation.width) - TREE_VIEW_DRAG_WIDTH/2, - allocation.y, - TREE_VIEW_DRAG_WIDTH, allocation.height); - } - g_object_notify_by_pspec (G_OBJECT (tree_column), tree_column_props[PROP_X_OFFSET]); g_object_notify_by_pspec (G_OBJECT (tree_column), tree_column_props[PROP_WIDTH]); } @@ -3104,12 +3043,6 @@ gtk_tree_view_column_get_button (GtkTreeViewColumn *tree_column) return tree_column->priv->button; } -GdkWindow * -_gtk_tree_view_column_get_window (GtkTreeViewColumn *column) -{ - return column->priv->window; -} - void _gtk_tree_view_column_push_padding (GtkTreeViewColumn *column, gint padding) @@ -3138,3 +3071,30 @@ _gtk_tree_view_column_get_context (GtkTreeViewColumn *column) { return column->priv->cell_area_context; } + +gboolean +_gtk_tree_view_column_coords_in_resize_rect (GtkTreeViewColumn *column, + double x, + double y) +{ + GtkTreeViewColumnPrivate *priv = column->priv; + GtkAllocation button_allocation; + + /* x and y are in treeview coordinates. */ + + if (!gtk_widget_get_realized (priv->button) || + !priv->resizable || + !priv->visible) + return FALSE; + + gtk_widget_get_outer_allocation (priv->button, &button_allocation); + + /* No translation needed */ + g_assert (gtk_widget_get_parent (priv->button) == priv->tree_view); + + if (gtk_widget_get_direction (priv->tree_view) == GTK_TEXT_DIR_LTR) + button_allocation.x += button_allocation.width - TREE_VIEW_DRAG_WIDTH; + + button_allocation.width = TREE_VIEW_DRAG_WIDTH; + return gdk_rectangle_contains_point (&button_allocation, (int)x, (int)y); +} -- 2.30.2